{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lecture 4\n",
    "\n",
    "Substitution Method; Median and Selection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Part 1: Substitution Method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nastyRecurrence(n):\n",
    "    if n <= 10:\n",
    "        return 1\n",
    "    return n + nastyRecurrence(n/5) + nastyRecurrence(7*n/10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\ngRZxBEk9QofeiJRj2mRxJMcAYKa735nYNQIoGwHSg9DXUlbePY4iaQd8GZvZo4AOZtYw/g+xQyyr\nddz9Cndv6u7NCN/fOHc/DXgFOCFWK3/NZb+LE2J9j+WnxFFDzYEWhE7NWsfdPwXmm9nusehIYAZ5\n/D0Tbnu1M7Ot45/zsmvO2+85ISPfa9y33Mzaxd9h98S5qibtDqdceBFGUHxAGAVyVdrxbOa1HEJo\nGk8FpsRXF8K95LHAHOBloFGsb8D98drfB4oS5zoLKImvM9O+tipe/2F8N/prN8I/FiXAM8CWsXyr\n+L4k7t8tcfxV8Xcxm2qOiknhWvcDiuN3PYwwyievv2fgOmAWMA14nDCCK6++Z+ApQp/RGkKLtGcm\nv1egKP7+PgTuo9xgj8pemqZFREQyRre/REQkY5RUREQkY5RUREQkY5RUREQkY5RUREQkY5RUREQk\nY5RUREQkY5RURFJmZs3ieid/jWuBjDaz+mnHJbIplFREaocWwP3uviewDPhNyvGIbBIlFZHaYa67\nT4nbEwnrZYjkHCUVkdphVWJ7HWHqepGco6QiIiIZo6QiIiIZo1mKRUQkY9RSERGRjFFSERGRjFFS\nERGRjFFSERGRjFFSERGRjFFSERGRjFFSERGRjPl/2TGh8bSCIx4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fafd780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nVals = list( range(1,10000,10))\n",
    "rVals = [ nastyRecurrence(n) for n in nVals]\n",
    "plt.plot( nVals, rVals, color=\"red\")\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"T(n)\")\n",
    "plt.title(\"T(n) = n + T(n/5) + T(7n/10)\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Part 2: SELECT"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# some extra functions that will be useful\n",
    "from auxFileLecture4 import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here are a bunch of different ways we might pick a pivot.  \n",
    "We'll see our final way (chooseFancyFivePivot) later on in this notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Choose a random pivot; this takes time O(1)\n",
    "def chooseRandomPivot(A):\n",
    "    return choice( range(len(A)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Choose the pivot to be n/2; also takes time O(1)\n",
    "def chooseArbitraryPivot(A):\n",
    "    return round(len(A)/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Choose the pivot to be t (unless the array is shorter than t); takes time O(1)\n",
    "def chooseMyFavoritePivot(A,t=3):\n",
    "    if len(A) < t+1:\n",
    "        return 0\n",
    "    return t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# this finds the \"best\" pivot (that is, that splits the array in half); but in runs in time O(n log(n))\n",
    "def chooseIdealPivot(A):\n",
    "    B = A[:]\n",
    "    B.sort()\n",
    "    pivotVal = B[(len(B)/2).__trunc__()]\n",
    "    return A.index(pivotVal)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# this finds the *worst* pivot; runs in time O(n)\n",
    "def chooseWorstPivot(A):\n",
    "    m = min(A)\n",
    "    return A.index(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's define our SELECT algorithm.  It can use any of the above pivot-choosing algorithms in it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Returns L, A[p], R, where L has all the elements less or equal to A[p], R has all the elements greater than A[p]\n",
    "def myPartition(A, p):\n",
    "    L = []\n",
    "    R = []\n",
    "    for i in range(len(A)):\n",
    "        if i == p:\n",
    "            continue\n",
    "        if A[i] <= A[p]: # This is NOT a good idea if the array doesn't have distinct elts.  (Why?)\n",
    "            L.append(A[i])\n",
    "        else:\n",
    "            R.append(A[i])\n",
    "    return L, A[p], R\n",
    "\n",
    "# Returns the k'th smallest element of A\n",
    "def mySelect( A, k ):\n",
    "    if len(A) <= 50:\n",
    "        A = mergeSort(A)\n",
    "        return A[k-1]\n",
    "    p = chooseMyFavoritePivot(A) # We can plug in whatever choosePivot algorithm we want here! \n",
    "    L, mid, R = myPartition(A,p)\n",
    "    if len(L) == k-1:\n",
    "        return mid\n",
    "    elif len(L) > k-1: # then the k'th smallest thing is the k'th smallest thing in the left half\n",
    "        return mySelect(L, k)\n",
    "    elif len(L) < k-1: # then the k'th smallest thing is the (k - len(L) - 1)'st smallest thing in the right half\n",
    "        return mySelect(R, k - len(L) - 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A quick sanity-check..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[16, 3, 29, 34, 38, 45, 2, 36, 26, 33, 9, 18, 6, 41, 22, 14, 47, 37, 43, 30, 48, 23, 7, 8, 5, 15, 10, 39, 32, 49, 13, 35, 27, 21, 11, 24, 40, 44, 12, 4, 19, 46, 28, 17, 20, 25, 31, 1, 42]\n"
     ]
    }
   ],
   "source": [
    "# Let's make sure it works!  Make a list with all the numbers from 1 to 49 in some order\n",
    "from random import shuffle\n",
    "A = list(range(1,50))\n",
    "shuffle(A)\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The 6'th smallest is 6\n",
      "The 12'th smallest is 12\n",
      "The 15'th smallest is 15\n"
     ]
    }
   ],
   "source": [
    "# k'th smallest should be k\n",
    "print(\"The 6'th smallest is\", mySelect(A, 6))\n",
    "print(\"The 12'th smallest is\", mySelect(A, 12))\n",
    "print(\"The 15'th smallest is\", mySelect(A, 15))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### How long does it take?\n",
    "\n",
    "Let's try a few different pivot strategies and also the sort-it-and-find-the-right-value strategy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "nVals = list(range(50, 3050, 100)) + list(range(3000, 5000, 500)) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# run this cell when we have chooseRandomPivot in mySelect\n",
    "nValuesRandom, tValuesRandom = trySelectABunch(mySelect, Ns = nVals, numTrials=50, listMax = 100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Try this one when we have chooseMyFavoritePivot(A,0) in mySelect,\n",
    "# and then we'll choose the random=False flag in trySelectABunch, which chooses an array that's worst-case for the choice of p=0.\n",
    "# Only go up to 1000 since it takes too long...\n",
    "nValsSmall = range(50, 1000, 100)\n",
    "nValuesWorst, tValuesWorst = trySelectABunch(mySelect, Ns=nValsSmall, numTrials=25, listMax = 100000, random=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Try this one when we have chooseFancyFivePivot in mySelect; chooseFancyFivePivot is defined below, so come back to this.\n",
    "nValuesFancy, tValuesFancy = trySelectABunch(mySelect, Ns=nVals, numTrials=50, listMax = 100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def mergeSortSelect(A,k):\n",
    "    A = mergeSort(A)\n",
    "    return A[k-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Now try mergeSortSelect\n",
    "nValuesMerge, tValuesMerge = trySelectABunch(mergeSortSelect, Ns=nVals, numTrials=50, listMax = 100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x10fc32860>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fb8abe0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(nValuesRandom, tValuesRandom, color=\"red\", label=\"SELECT with random pivot\")\n",
    "# Comment out the next line until you've generated nValuesFancy, tValuesFancy\n",
    "#plt.plot(nValuesFancy, tValuesFancy, \":\", color=\"green\", label=\"SELECT with (dumb impl. of) fancy pivot\")\n",
    "plt.plot(nValuesMerge, tValuesMerge, \"-.\", color=\"blue\", label=\"MergeSort SELECT\")\n",
    "plt.plot(nValuesWorst, tValuesWorst, \"--\", color=\"orange\", label=\"SELECT with worst pivot\")\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"Time(ms)\")\n",
    "plt.legend()\n",
    "plt.title(\"Selection\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Is it plausible that MergeSort-SELECT takes time O(nlog(n)) and fancy-SELECT takes time O(n), given the picture above?  Shouldn't the blue curve eventually go above the green curve?  Yes, but if the constant hiding inside the O(n) is like 20 (or rather, 20 times larger than the constant inside of the O(nlog(n))), that won't happen until n = 2^20 (which is really big, at least for my laptop).  The picture below shows that it *is* plausible that MergeSort-SELECT is O(nlog(n)) while fancy-SELECT is O(n)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x10fb95668>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fd7b7b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "xVals = range(1,5000)\n",
    "plt.plot( xVals, [(x*np.log(x)/np.log(2)) for x in xVals] , \"-.\",color=\"blue\", label=\"nlog(n)\" )\n",
    "plt.plot( xVals, [20*x for x in xVals], \":\",color = \"green\", label=\"20*n\")\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pivot-choosing strategy\n",
    "\n",
    "Here's the pivot-choosing strategy we discussed in class, which runs in time O(n) (plus a call to mySelect), and finds a pivot that's close to the median."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# first define a naive (nlog(n)-time) median algorithm to use for the groups of size 5.\n",
    "def naiveMedian(A):\n",
    "    A = mergeSort(A) # nlogn time sorting alg\n",
    "    return A[(len(A)/2).__trunc__()]\n",
    "\n",
    "# this is the final pivot selection algorithm described on the slides \n",
    "# (not implemented very slickly)\n",
    "# it finds a \"pretty good\" pivot (splits the array close to in half).\n",
    "# It runs in time O(n), in addition to a call to mySelect.\n",
    "def chooseFancyFivePivot(A):\n",
    "    # first, split A into n/5 groups, and find the median of each group.\n",
    "    current = 0\n",
    "    submedians = []\n",
    "    while current < len(A):\n",
    "        if current + 5 < len(A):\n",
    "            currentGrp = A[current:current+5]\n",
    "        else:\n",
    "            currentGrp = A[current:]\n",
    "        submedians.append( naiveMedian(currentGrp) )\n",
    "        current += 5\n",
    "    # now that we have our list of sub-medians, we'll find what the median is of those,\n",
    "    # using a recursive call to mySelect.\n",
    "    pivotVal = mySelect( submedians, (len(submedians)/2).__trunc__() )\n",
    "    # now we should actually return the index of pivotVal.  \n",
    "    # if we were being smart we would have implemented mySelect to just do this, \n",
    "    # but since we're interested in clarity and big-oh runtime, we'll just find the index in O(n) time.\n",
    "    for i in range(len(A)):\n",
    "        if A[i] == pivotVal:\n",
    "            return i\n",
    "    print(\"If we ever get to this stage, that's a problem!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can got back and plug this choosePivot function into our mySelect algorithm.\n",
    "\n",
    "(Seems to work)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def testDifferentPivotMethods(n, trials=100, listMax = 1000):\n",
    "    rLst = [] # this will be the indices we return with the random pivot\n",
    "    fLst = [] # with a fancy pivot\n",
    "    for t in range(trials):\n",
    "        # generate a random list\n",
    "        A = [ choice(range(listMax)) for i in range(n) ]\n",
    "        # random pivot\n",
    "        rPivot = chooseRandomPivot(A)\n",
    "        rVal = A[rPivot]\n",
    "        # fancy pivot\n",
    "        fPivot = chooseFancyFivePivot(A)\n",
    "        fVal = A[fPivot]\n",
    "        # how good *are* these pivots?  \n",
    "        A.sort()\n",
    "        rLst.append(A.index(rVal))\n",
    "        fLst.append(A.index(fVal))\n",
    "    return rLst, fLst"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "n = 101\n",
    "rLst, fLst = testDifferentPivotMethods(n, trials=500, listMax=1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n1tClS5faeZtvvnnt+86dO7Nq1ap6t9O1a1dGjx7NnXfeyS233MLs2bNzl6t7M2bd6S5dujBy5Eju\nvfdepk+fzmmnndaUw2pxrkGYWbuzdOlSevXqRadOnbjhhhtYvbrhS5p77rknb731Fk8++SQAy5Yt\nq00cZ555Jueddx4HHHAA2223Xe769913H++//z4rVqxgxowZHHzwwestM3bsWCZPnszDDz/MUUcd\nBcAhhxzCTTfdBMBLL73E66+/zp577snWW2/NsmXLmnz8zcUJwsyaTXNfhWiqr3/960ydOpXBgwcz\nb948ttxyywaX32yzzZg+fTrnnnsugwcPZvTo0bVPIO+///5ss802TJw4sd71hw8fzkknncSgQYM4\n6aSTqKioWG+ZI488koceeogjjjiCzTbbrDbONWvWMHDgQMaOHcuUKVPYfPPNOeyww3jxxRfLfpG6\nTY9JXVFRER4wyMqpo9/mOnfuXPbee+9yh1FSb775JiNHjmTevHl06rT+b+opU6ZQWVnJVVddVYbo\nGpd3jiTNjoj1s1gdrkGYmdXj+uuv57Of/Sw//vGPc5NDe+cahNlGcA2i/dcg2jrXIMzMrNk5QZiZ\nWS4nCDMzy+UEYWZmuZwgzKz5lKG/75ruvvfbbz+OO+44lixZ0iyHsnDhQvbbb79m2VYxKisrOe+8\n85q07owZM9bpTqS5OEGYWZtW0xfT888/z/bbb8/VV19d7pCapKKigiuuuKJJ6zpBmJk14sADD2TR\nomyssQ8//JBRo0YxbNgwBg4cyJ133glkNYO9996bs846i3333ZcjjzySFStWADB79mwGDx7M4MGD\n10k0ed1yQ/aQ3AknnMDo0aPp168fV111FZdeeilDhw5lxIgRvP/+++vFOGHCBM455xwqKirYY489\nuOuuu4CsK/Jjjz2WNWvW0K9fv3VqQgMGDGDx4sUsXLiQww8/nEGDBjFq1Chef/11Hn30UWbOnMl3\nvvMdhgwZwt///vdm+zydIMysXVi9ejUPPPAAxx9/PJB1kHfHHXfw1FNPMWvWLC644ILasR9efvll\nJk2axAsvvEC3bt247bbbAJg4cSJXXnnlemM+XH311UjiueeeY9q0aYwfP762K47nn3+e22+/nSef\nfJIf/OAHdO3alaeffpoDDzyQ66+/PjfWhQsX8sQTT3D33Xdzzjnn1G4LoFOnTowZM6a2Z9rHH3+c\n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\ngg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10fbcb6d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    " # now plot them\n",
    "plt.hist([fLst,rLst], label=[\"Fancy pivot\",\"Random pivot\"], color=[\"blue\",\"red\"],bins=40,range=(0,n))\n",
    "plt.xlabel(\"index returned (out of n=\" + str(n) + \")\")\n",
    "plt.ylabel(\"frequency\")\n",
    "plt.legend()\n",
    "plt.title(\"Pivot Selection Algs\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
